using BepuPhysics;
using BepuPhysics.Collidables;
using BepuPhysics.Constraints;
#if MYCODE
using BepuUtilities.Vectors;
#else
using System.Numerics;
#endif
namespace Demos.Demos.Tanks
{
    /// <summary>
    /// 描述坦克的结构。
    /// </summary>
    public struct TankDescription
    {
        /// <summary>
        /// 坦克炮塔主体的描述。
        /// </summary>
        public TankPartDescription Turret;
        /// <summary>
        /// 坦克桶体的描述。
        /// </summary>
        public TankPartDescription Barrel;
        /// <summary>
        /// 坦克主体的描述。
        /// </summary>
        public TankPartDescription Body;
        /// <summary>
        /// 桶锚在坦克局部空间的位置。枪管将在此位置连接到炮塔。
        /// </summary>
        public Vector3 BarrelAnchor;
        /// <summary>
        /// 炮塔锚在坦克局部空间的位置。炮塔将在此位置连接到主体。
        /// </summary>
        public Vector3 TurretAnchor;
        /// <summary>
        /// 炮塔和炮管的底座。(0,0,-1)*坦克局部空间中的TurretBasis对应于转塔旋转和筒体俯仰测量的0角。
        /// (1,0,0)*TurretBasis对应于90度旋转角度。
        /// (0,1,0)*TurretBasis对应于90度俯仰角,是转塔可以绕其旋转的轴。
        /// </summary>
        public Quaternion TurretBasis;
        /// <summary>
        /// 坦克旋转约束的伺服属性。
        /// </summary>
        public ServoSettings TurretServo;
        /// <summary>
        /// 坦克旋转约束的弹簧属性。
        /// </summary>
        public SpringSettings TurretSpring;
        /// <summary>
        /// 坦克炮管俯仰约束的伺服特性。
        /// </summary>
        public ServoSettings BarrelServo;
        /// <summary>
        /// 坦克桶俯仰约束的弹簧特性。
        /// </summary>
        public SpringSettings BarrelSpring;

        /// <summary>
        /// 应在枪管本体的局部空间中创建抛射物的位置。
        /// </summary>
        public Vector3 BarrelLocalProjectileSpawn;
        /// <summary>
        /// 射弹的惯性。
        /// </summary>
        public BodyInertia ProjectileInertia;
        /// <summary>
        /// 射出的弹丸的形状。
        /// </summary>
        public TypedIndex ProjectileShape;
        /// <summary>
        /// 射弹的速度。
        /// </summary>
        public float ProjectileSpeed;


        /// <summary>
        /// 用于所有轮子的形状。
        /// </summary>
        public TypedIndex WheelShape;
        /// <summary>
        /// 每个轮体的惯性。
        /// </summary>
        public BodyInertia WheelInertia;

        /// <summary>
        /// 轮子的局部方向。(1,0,0)*WheelOrientation是悬挂方向,(0,1,0)*WheelOrientation是车轮的旋转轴,(0,0,1)*WheelOrientation是踏板将沿其延伸的轴。
        /// </summary>
        public Quaternion WheelOrientation;
        /// <summary>
        /// 从坦克的局部空间原点到左侧踏板中心的偏移。踏步将沿(0,0,1)*车轮方向对齐。
        /// </summary>
        public Vector3 LeftTreadOffset;
        /// <summary>
        /// 从坦克的局部空间原点到右踏板中心的偏移。踏步将沿(0,0,1)*车轮方向对齐。
        /// </summary>
        public Vector3 RightTreadOffset;
        /// <summary>
        /// 每个踏步中的轮数。
        /// </summary>
        public int WheelCountPerTread;
        /// <summary>
        /// 踏面上的轮子之间应该留出多大的间距。
        /// </summary>
        public float TreadSpacing;
        /// <summary>
        /// 每个车轮的悬架的静止长度。
        /// </summary>
        public float SuspensionLength;
        /// <summary>
        /// 车轮悬挂的弹簧设置。
        /// </summary>
        public SpringSettings SuspensionSettings;
        /// <summary>
        /// 轮体的摩擦力。
        /// </summary>
        public float WheelFriction;
    }
}
